﻿// ***********************************************************************
// Assembly         : Delta_entidad
// Author           : Juan Alberto Cerino Gomez
// Created          : 04-12-2013
//
// Last Modified By : Juan Alberto Cerino Gomez
// Last Modified On : 06-02-2013
// ***********************************************************************
// <copyright file="AttPropiedad.cs" company="Delta Bussines">
//     Copyright (c) 2013  Delta Bussines. All rights reserved.
// </copyright>
// <summary></summary>
// ***********************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Delta_util.Estaticos;
using System.Reflection;
using Delta_util.Clases;

namespace Delta_entidad.Atributos
{
    /// <summary>
    /// Este atributo se coloca en las propiedades de la clase, se usa para indicar la representación de la columna en la tabla y la representación en el editor de datos.
    /// </summary>
    [Serializable()]
    [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
    public class AttPropiedad : System.Attribute
    {

        /// <summary>
        /// Variable que contiene la configuración dinamica del campo.
        /// </summary>
        private Delta_entidad.EntidadesControl.Cat_campo_tecnico _datos_campo = new EntidadesControl.Cat_campo_tecnico();

        /// <summary>
        /// Variable que indica el tipo de editor configurado al campo.
        /// </summary>
        private Enumerados.TIPO_EDITOR _tipoEditor;
        /// <summary>
        /// Obtiene los datos de la configuración dinámica del campo.
        /// </summary>
        /// <value>Devuelve null cuando el campo no tiene configuración asignada.</value>
        public Delta_entidad.EntidadesControl.Cat_campo_tecnico datos_campo { get { return _datos_campo; } }
        /// <summary>
        /// Obtiene o establece el titulo del campo, este titulo se muestra en el panel de edición y en el GridView.
        /// </summary>
        /// <value>Devuelve el texto que se usa como titulo del campo.</value>
        public string titulo { get { return datos_campo.titulo; } set { datos_campo.titulo = value; } }
        /// <summary>
        /// Obtiene o establece el valor que indica si el campo se muestra en el GridView.
        /// </summary>
        /// <value>Valor que indica si el campo se muestra en el GridView.</value>
        public bool incluirGrid { get { return datos_campo.mostrar_tabla; } set { datos_campo.mostrar_tabla = value; } }
        /// <summary>
        /// Obtiene o establece el valor que indica si el campo es editable, si no es editable entonces el campo no se muestra en el panel de edición.
        /// </summary>
        /// <value>Devuelve el valor que indica si el campo se debe mostrar o no en el panel de edición.</value>
        public bool editable { get { return datos_campo.editable; } set { datos_campo.editable = value; } }
        /// <summary>
        /// Obtiene o establece el valor que indica si el campo es de solo lectura.
        /// </summary>
        /// <value>Devuelve el valor que indica si el campo es de solo lectura.</value>
        public bool solo_lectura { get { return datos_campo.solo_lectura; } set { datos_campo.solo_lectura = value; } }
        /// <summary>
        /// Obtiene o establece el valor que indica si el campo es requerido, en caso de que el campo sea requerido, se autoconfigura el validador para el campo.
        /// </summary>
        /// <value>Devuelve el valor que indica si el campo es requerido.</value>
        public bool requerido { get { return datos_campo.requerido; } set { datos_campo.requerido = value; } }
        /// <summary>
        /// Obtiene o establece el tipo de editor a usar para el campo.
        /// </summary>
        /// <value>Devuelve el tipo de editor a usar para el campo.</value>
        public Enumerados.TIPO_EDITOR tipoEditor
        {
            get { return _tipoEditor; }
            set { _tipoEditor = value; ActualizarEditor(); }
        }


        /// <summary>
        ///[Lista] Obtiene o establece el nombre de la propiedad que se enlazará con un DropDownList, esta propiedad sera el valor que devolverá el control web.
        /// </summary>
        /// <value>Devuelve el nombre clave.</value>
        public string clave { get { return datos_campo.tipo.campo_valor; } set { datos_campo.tipo.campo_valor = value; } }
        /// <summary>
        ///[Lista] Obtiene o establece el nombre de la propiedad que se enlazará con un DropDownList, esta propiedad sera el texto que se visualice en el control web.
        /// </summary>
        /// <value>The texto.</value>
        public string texto { get { return datos_campo.tipo.campo_texto; } set { datos_campo.tipo.campo_texto = value; } }
        /// <summary>
        /// [Lista] Obtiene o establece los parametros enviados al metodo que se ejecuta para obtener los datos, son separados por coma, cabe señalar que el orden debe ser el mismo del metodo.
        /// </summary>
        /// <value>Listado de parametros.</value>
        public string parametros { get { return datos_campo.tipo.parametros; } set { datos_campo.tipo.parametros = value; } }
        /// <summary>
        /// [Lista] Obtiene el nombre de la propiedad, segun el tipo de editor confifgurado para el campo.
        /// </summary>
        /// <value>Devuelve la propiedad, segun el tipo de editor, de la cual se va a leer el valor.</value>
        public string GetPropiedadControl { get { return Comun.GetPropiedadValorEditor(tipoEditor); } }
        /// <summary>
        /// [Lista] Obtiene o establece el nombre de las propiedades de los cuales depende esta propiedad, esto nos permite activar el postback de nuestra lista para que actualice la lista de otra propiedad.
        /// </summary>
        /// <value>Lista de campos de los que depende este campo.</value>
        public string dependencias { get { return datos_campo.dependencia; } set { datos_campo.dependencia = value; } }
        /// <summary>
        /// Obtiene o establece el texto que se muestra como comentario en el panel de edción.
        /// </summary>
        /// <value>Comentario que se muestra en el panel de edición.</value>
        public string comentarios { get { return datos_campo.comentario; } set { datos_campo.comentario = value; } }


        /// <summary>
        /// Metodo que se encarga de asignar la configuración del editor, segun el tipo de editor seleccionado.
        /// </summary>
        protected internal void ActualizarEditor()
        {

            switch (tipoEditor)
            {
                case Enumerados.TIPO_EDITOR.CHECK:
                    datos_campo.tipo_editor.ensamblado = null;
                    datos_campo.tipo_editor.editor = "System.Web.UI.WebControls.CheckBox";
                    datos_campo.tipo_editor.propiedad_valor = "Checked";
                    datos_campo.tipo_editor.grid_ensamblado = null;
                    datos_campo.tipo_editor.grid_editor = "System.Web.UI.WebControls.CheckBoxField";
                    break;
                case Enumerados.TIPO_EDITOR.LISTA:
                    datos_campo.tipo_editor.ensamblado = null;
                    datos_campo.tipo_editor.editor = "System.Web.UI.WebControls.DropDownList";
                    datos_campo.tipo_editor.propiedad_valor = "SelectedValue";
                    datos_campo.tipo_editor.grid_editor = "System.Web.UI.WebControls.BoundField";
                    break;
                case Enumerados.TIPO_EDITOR.HIDDEN:
                    datos_campo.tipo_editor.ensamblado = null;
                    datos_campo.tipo_editor.editor = "System.Web.UI.WebControls.HiddenField";
                    datos_campo.tipo_editor.propiedad_valor = "Value";
                    datos_campo.tipo_editor.grid_editor = "System.Web.UI.WebControls.BoundField";
                    break;
                case Enumerados.TIPO_EDITOR.TEXTBOX_MULTILINEA:
                    datos_campo.tipo_editor.ensamblado = null;
                    datos_campo.tipo_editor.editor = "System.Web.UI.WebControls.TextBox";
                    datos_campo.tipo_editor.propiedad_valor = "Text";
                    if (string.IsNullOrWhiteSpace(datos_campo.tipo_editor.valores_propiedades))
                        datos_campo.tipo_editor.valores_propiedades = "TextMode|1";
                    else
                        datos_campo.tipo_editor.valores_propiedades += ",TextMode|1";
                    datos_campo.tipo_editor.grid_editor = "System.Web.UI.WebControls.BoundField";
                    break;
                default:
                    datos_campo.tipo_editor.ensamblado = null;
                    datos_campo.tipo_editor.editor = "System.Web.UI.WebControls.TextBox";
                    datos_campo.tipo_editor.propiedad_valor = "Text";
                    datos_campo.tipo_editor.grid_editor = "System.Web.UI.WebControls.BoundField";
                    break;
            }


        }


        /// <summary>
        /// Constructor de la clase que configura los datos basicos.
        /// </summary>
        /// <param name="TituloCampo">Indica el titulo que se muestra en el GridView y ademas el titulo que se muestra en el formulario de inserción/modificación.</param>
        /// <param name="ComentariosCampo">Comentario que se muestra en el panel de edición.</param>
        /// <param name="Orden">Orden en la que se presentan los campos en el panel de edición y en el GridView.</param>
        public AttPropiedad(string TituloCampo, string ComentariosCampo, Int16 Orden = 0)
        {
            titulo = TituloCampo;
            tipoEditor = Enumerados.TIPO_EDITOR.TEXBOX;
            solo_lectura = false;
            incluirGrid = true;
            requerido = false;
            comentarios = ComentariosCampo;
            datos_campo.orden = Orden;


        }

        /// <summary>
        /// Constructor de la clase que permite configurar la forma en que se presentan los campos.
        /// </summary>
        /// <param name="TituloCampo">Indica el titulo que se muestra en el GridView y ademas el titulo que se muestra en el formulario de inserción/modificación.</param>
        /// <param name="IncluirEnGrid">Este parametro indica si el campo se muestra en el GridView al momento de visualizar los datos. Por default el valor es true.</param>
        /// <param name="SoloLectura">Indica si el campo es de solo lectura, al momento de insertar/modificar el registro, el campo se muestra deshabilitado. Por default el valor es false.</param>
        /// <param name="EsRequerido">Indica si el campo es obligatorio, no permitiendo la inserción/modificación de los datos si este campo no es ingresado.
        /// Por default el valor es false.</param>
        /// <param name="EsEditable">Indica si el campo es mostrado al momento de la inserción/modificación de los datos, Por default el valor es true.</param>
        /// <param name="TipoEditor">Nos indica el tipo de editor que se muestra en el proceso de inserción/modifcación de los datos, por default el valor es Delta_util.Estaticos.Enumerados.TIPO_EDITOR.TEXTBOX.</param>
        /// <param name="ComentariosCampo">Comentario que se muestra en el panel de edición.</param>
        /// <param name="Orden">Orden en la que se presentan los campos en el panel de edición y en el GridView.</param>
        public AttPropiedad(string TituloCampo,
            bool IncluirEnGrid = true,
            bool SoloLectura = false,
            bool EsRequerido = false,
            bool EsEditable = true,
            Enumerados.TIPO_EDITOR TipoEditor = Enumerados.TIPO_EDITOR.TEXBOX,
            string ComentariosCampo = null,
            Int16 Orden = 0)
        {
            titulo = TituloCampo;
            editable = EsEditable;
            tipoEditor = TipoEditor;
            solo_lectura = SoloLectura;
            incluirGrid = IncluirEnGrid;
            requerido = EsRequerido;
            comentarios = ComentariosCampo;
            datos_campo.orden = Orden;
        }

        /// <summary>
        /// Constructor avanzado de la clase.
        /// </summary>
        /// <param name="TituloCampo">Indica el titulo que se muestra en el GridView y ademas el titulo que se muestra en el formulario de inserción/modificación.</param>
        /// <param name="IncluirEnGrid">Este parametro indica si el campo se muestra en el GridView al momento de visualizar los datos. Por default el valor es true.</param>
        /// <param name="SoloLectura">Indica si el campo es de solo lectura, al momento de insertar/modificar el registro, el campo se muestra deshabilitado. 
        /// <br/>Por default el valor es false.</param>
        /// <param name="EsRequerido">Indica si el campo es obligatorio, no permitiendo la inserción/modificación de los datos si este campo no es ingresado.
        /// <br/>Por default el valor es false.</param>
        /// <param name="EsEditable">Indica si el campo es mostrado al momento de la inserción/modificación de los datos, Por default el valor es true.</param>
        /// <param name="TipoEditor">Nos indica el tipo de editor que se muestra en el proceso de inserción/modifcación de los datos, por default el valor es Delta_util.Estaticos.Enumerados.TIPO_EDITOR.TEXTBOX.</param>
        /// <param name="ComentariosCampo">Comentario que se muestra en el panel de edición.</param>
        /// <param name="DllDatos">[Lista] Indica el nombre completo de la DLL en donde se encuentra alojado la clase la cual va a devolver los datos para rellenar la lista.
        /// <br/>La DLL debe encontrarse en el directorio BIN del proyecto web, Por default el valor es null.</param>
        /// <param name="ControlDatos">[Lista] Indica el nombre completo de la clase en donde se encuentra el metodo encargado de obtener los datos para rellenar la lista.
        /// <br/>Recuerde que el nombre completo es aquel en el que se incluye los espacios de nombres, si es que existen, por default el valor es null.</param>
        /// <param name="MetodoDatos_DataSource">[Lista]  Nombre del metodo el cual se va a ejecutar para obtener los datos para rellenar la lista.
        /// <br />Si el metodo no devuelve directamente los datos, puede especificar la propiedad que contiene el resultado, por ejemplo "ObtenerListado|Lista". 
        /// <br/>Si el metodo devuelve los datos, entonces no es necesario especificar la propiedad, por ejemplo "ObtenerListado".
        /// <br/>Si la lista es fija, entonces los valores para la lista se especifica de la siguiente manera: Opcion1|10,Opcion2|20,.....
        /// <br/>Por default el valor es null.</param>
        /// <param name="NombreCampoValor">[Lista] Indica el nombre de la propiedad la cual se va a tomar como clave en la lista.</param>
        /// <param name="NombreCampoTexto">[Lista] Indica el nombre de la propiedad la cual se va a mostrar al usuario en el objeto DropDownList.</param>
        /// <param name="ParametrosConsulta">[Lista] Parametros enviados al metodo que se ejecuta para obtener los datos, son separados por coma, cabe señalar que el orden debe ser el mismo del metodo.
        /// <br/>Por default el valor es null.</param>
        /// <param name="CamposDependencias">Nombre de las propiedades de los cuales depende esta propiedad, esto nos permite activar el postback de nuestra lista para que actualice la lista de otra propiedad.
        /// <br/>Por default el valor es null.</param>
        /// <param name="ListaFija">[Lista] Indica si la lista es fija, cuando una lista es fija, los datos se obtiene del parametro MetodoDatos_DataSource, sin cargar ninguna DLL.</param>        
        /// <param name="Orden">Orden en la que se presentan los campos en el panel de edición y en el GridView.</param>
        public AttPropiedad(string TituloCampo,
            bool IncluirEnGrid,
            bool SoloLectura,
            bool EsRequerido,
            bool EsEditable,
            Enumerados.TIPO_EDITOR TipoEditor,
            string ComentariosCampo,
            string DllDatos,
            string ControlDatos,
            string MetodoDatos_DataSource,
            string NombreCampoValor,
            string NombreCampoTexto,
            string ParametrosConsulta = "",
            string CamposDependencias = "",
            bool ListaFija = false,
            int Orden = 0)
        {
            comentarios = ComentariosCampo;
            titulo = TituloCampo;
            tipoEditor = TipoEditor;
            solo_lectura = SoloLectura;
            incluirGrid = IncluirEnGrid;
            requerido = EsRequerido;
            editable = EsEditable;
            parametros = ParametrosConsulta;
            if (string.IsNullOrWhiteSpace(CamposDependencias))
                dependencias = null;
            else
                dependencias = CamposDependencias;
            if (!string.IsNullOrWhiteSpace(DllDatos))
                datos_campo.tipo.data_source = DllDatos + "|" + ControlDatos + "|" + MetodoDatos_DataSource;
            if (ListaFija)
                datos_campo.tipo.data_source = MetodoDatos_DataSource;
            datos_campo.tipo.listado_fijo = ListaFija;
            clave = NombreCampoValor;
            texto = NombreCampoTexto;
            datos_campo.orden = (Int16)Orden;

        }
    }
}
